package com.mmall.concurerency.singleton;


import com.mmall.concurerency.annoations.ThreadSafe;

/**
 * 饿汉模式 改造
 */
@ThreadSafe
public class SingletonExample4 {
    //私有构造函数
    public SingletonExample4() {

    }

    //  1.memory = allocate() 分配对象的内存空间
    //  2.ctorInstance()  初始化对象
    //  3.instance = memory  设置instance 指向刚分配的内存
    //这个是正常的创建对象的顺序
    //但是如果CPU和JVM  优化，发生了指令重排
    //  1.memory = allocate() 分配对象的内存空间
    //  3.instance = memory  设置instance 指向刚分配的内存
    //  2.ctorInstance()  初始化对象

    //如果是单线程的话，肯定是没有问题的，但是如果是多线程会出现线程不安全。


    //单例对象
    private static SingletonExample4 singletonExample4 = null;
    //静态的工厂方法
    public static SingletonExample4 getInstance(){
        if(singletonExample4 == null){  //b线程  当a线程创建对象的时候，cpu和jvm优化的时候，对象已经指向地址了，但是没有初始化
            synchronized (SingletonExample4.class){
                if(singletonExample4 == null){
                    singletonExample4 = new SingletonExample4(); //a线程
                }
            }
        }
        return singletonExample4;
    }

}
